Nhân bản nhân vật (clone) và quản lý nhiều đối tượng
Học cách tạo hàng loạt bản sao nhân vật khi chạy dự án — từ mưa rơi, đạn bay đến kẻ thù xuất hiện — mà không cần thêm từng sprite thủ công.
Clone là gì?
Clone (bản sao) là một bản copy của nhân vật được tạo ra trong lúc dự án đang chạy. Mỗi clone kế thừa trang phục, âm thanh, script và biến của nhân vật gốc, nhưng sau đó hoạt động độc lập — có thể ở vị trí khác, làm việc khác và biến mất khi không cần nữa.
Các khối liên quan đến clone nằm trong nhóm Điều khiển (màu cam)
Hãy tưởng tượng nhân vật gốc là "khuôn in" và mỗi clone là một tờ in ra — cùng hình dạng ban đầu nhưng có thể được "tô màu" và di chuyển theo cách riêng.
❌ Nhiều sprite riêng lẻ
Tạo 20 sprite giống hệt nhau, copy script 20 lần — sửa một chỗ phải sửa 20 chỗ.
✅ Dùng clone
Một sprite mẫu, tạo 20 clone khi chạy — viết script một lần, quản lý tập trung.
💡 Ghi nhớ
Scratch giới hạn tối đa 300 clone cho mỗi nhân vật. Với game lớn, hãy xóa clone khi không dùng để tránh đạt giới hạn và làm chậm dự án.
Ba khối clone cần biết
Toàn bộ tính năng nhân bản xoay quanh ba khối sau:
tạo bản sao của
Sinh ra một clone mới từ nhân vật được chọn (thường là "bản thân")
khi tôi bắt đầu là bản sao
Script chỉ chạy trong clone vừa được tạo — không chạy ở nhân vật gốc
xóa bản sao này
Xóa clone hiện tại và dừng mọi script của nó
khi nhấn cờ xanh ẩn lặp mãi tạo bản sao của [bản thân v] đợi [0.5] giây kết thúc
khi tôi bắt đầu là bản sao hiện đi tới vị trí ngẫu nhiên đợi [2] giây xóa bản sao này
Ở ví dụ trên, nhân vật gốc ẩn đi và cứ mỗi 0,5 giây sinh một clone. Mỗi clone hiện ra ở chỗ ngẫu nhiên, chờ 2 giây rồi tự xóa — nhân vật gốc không bao giờ chạy script "khi tôi bắt đầu là bản sao".
💡 Ghi nhớ
Khối xóa bản sao nàykhông có tác dụng khi chạy trên nhân vật gốc — chỉ clone mới bị xóa. Nhân vật gốc luôn tồn tại trong suốt dự án.
Phân biệt nhân vật gốc và clone
Clone và nhân vật gốc dùng chung script, nên nhiều khối sự kiện (như khi nhấn cờ xanh, khi nhấn vào nhân vật) sẽ kích hoạt cả hai nếu bạn không phân tách. Đây là lỗi phổ biến khi mới học clone.
Cách tách script bằng biến cục bộ
Tạo biến loại chỉ dành cho nhân vật này (không phải biến toàn sân khấu):
khi nhấn cờ xanh đặt [loại v] thành [gốc] ẩn
khi tôi bắt đầu là bản sao đặt [loại v] thành [clone] hiện đi tới vị trí ngẫu nhiên
Sau đó bọc lệnh chỉ dành cho clone trong khối nếu:
khi nhấn vào nhân vật này nếu <(loại) = [clone]> thì xóa bản sao này kết thúc
Nhấn vào clone → nổ. Nhấn vào nhân vật gốc (đang ẩn) → không xảy ra gì vì loại vẫn là "gốc".
💡 Ghi nhớ
Khi nhấn cờ xanh, Scratch xóa tất cả clone còn sót từ lần chạy trước. Đây là thời điểm tốt để đặt lại biến và trạng thái ban đầu cho nhân vật gốc.
Quản lý nhiều đối tượng cùng lúc
Game và animation thường có hàng chục đối tượng di chuyển song song. Clone giúp bạn quản lý chúng theo mô hình sinh → hoạt động → tiêu hủy:
Sinh (spawn)
Tạo clone theo thời gian, sự kiện hoặc vị trí
Hành vi riêng
Mỗi clone nhận giá trị ngẫu nhiên hoặc ID khác nhau
Tiêu hủy
Xóa khi ra khỏi màn, hết máu hoặc hết hiệu lực
Đánh số clone bằng biến đếm
Dùng biến số thứ tự tăng dần trước mỗi lần tạo bản sao. Trong script khi tôi bắt đầu là bản sao, đọc giá trị đó để phân biệt clone thứ 1, 2, 3… và gán hành vi khác nhau.
📌 Ví dụ: Ba loại kẻ thù
Trước mỗi tạo bản sao: tăng số thứ tự thêm 1.
Trong khi tôi bắt đầu là bản sao:
Nếu số thứ tự mod 3 = 1 → chậm, nhiều máu.
Nếu = 2 → nhanh, ít máu.
Nếu = 0 → bắn đạn.
Dùng danh sách theo dõi vị trí
Với dự án phức tạp hơn, bạn có thể lưu tọa độ từng clone vào danh sách toàn sân khấu (ví dụ vị trí X, vị trí Y), mỗi clone cập nhật phần tử theo ID của mình. Sprite khác đọc danh sách để biết clone đang ở đâu — hữu ích cho game nhiều nhân vật tương tác.
Ứng dụng thực tế của clone
📌 Mưa hoặc tuyết rơi
Nhân vật gốc ẩn, lặp mãi tạo clone mỗi 0,1 giây. Clone: đặt y = 180, x ngẫu nhiên, lặp đến khi y < -180 thì xóa bản sao. Hàng trăm giọt mưa rơi mà chỉ cần một sprite.
📌 Đạn hoặc pháo hoa
Khi nhấn phím, tạo clone. Clone hướng theo góc bắn, tiến liên tục đến khi chạm cạnh hoặc chạm kẻ thù → xóa bản sao + tăng điểm.
📌 Vệt chuột (mouse trail)
Clone xuất hiện tại vị trí con trỏ, giảm kích thước hoặc tăng hiệu ứng ma dần, sau vài vòng lặp tự xóa — tạo đuôi mờ đẹp mắt.
📌 Bong bóng nổ
Cờ xanh: cứ 1 giây tạo clone. Clone: vị trí ngẫu nhiên, kích thước và màu ngẫu nhiên. Nhấn vào clone (với điều kiện loại = clone) → phát âm thanh và xóa bản sao.
Clone là kỹ thuật cốt lõi trong game arcade, bắn súng và hiệu ứng hạt trên Scratch
Mẹo và lỗi thường gặp
Ẩn nhân vật gốc khi chỉ cần clone
Nếu người chơi chỉ thấy clone (mưa, đạn, sao), hãy ẩn sprite gốc ngay khi cờ xanh — tránh một "bóng ma" đứng yên giữa màn hình.
Luôn có lối thoát
Mỗi clone cần điều kiện xóa rõ ràng: ra khỏi màn, hết thời gian, chạm đích, hoặc bị tiêu diệt. Clone không xóa sẽ tích tụ và làm dự án chậm dần.
Tránh tạo clone quá nhanh
Thêm đợi nhỏ giữa các lần tạo bản sao trong vòng lặp mãi — nếu không, hàng trăm clone sinh ra trong một giây và đạt giới hạn 300.
⚠️ Lỗi phổ biến
Đặt script di chuyển dưới khi nhấn cờ xanh mà không kiểm tra loại — nhân vật gốc và mọi clone đều chạy, gây hỗn loạn. Chuyển logic di chuyển sang khi tôi bắt đầu là bản sao hoặc dùng biến phân loại.
⚠️ Lỗi phổ biến
Quên rằng clone cũng nhận thông báo (broadcast). Một thông báo "tạo clone" có thể khiến mỗi clone tạo thêm clone — bùng nổ số lượng. Kiểm tra điều kiện trước khi tạo bản sao mới.
Viết script cho nhân vật gốc (sinh clone, ẩn/hiện).
Viết script riêng dưới khi tôi bắt đầu là bản sao.
Thêm biến loại để tách hành vi gốc và clone.
Đặt điều kiện xóa bản sao này ở mọi nhánh kết thúc.
Chạy thử, quan sát số clone (bật hiển thị biến đếm nếu cần).
Dự án thực hành: Game bắn sao băng
Xây dựng game đơn giản: sao băng rơi từ trên xuống, người chơi điều khiển tàu bắn trúng để ghi điểm.
Clone: loại = clone, đi tới x ngẫu nhiên y = 180, quay hướng 180°, lặp đến khi y < -190 → xóa bản sao.
Khi clone bị nhấn (hoặc chạm đạn): tăng điểm, hiệu ứng, xóa bản sao.
Sprite Tàu / Đạn: dùng clone cho đạn — mỗi phát bắn tạo một clone bay thẳng, xóa khi chạm sao hoặc chạm cạnh.
💡 Ghi nhớ
Clone dạy bạn tư duy quản lý vòng đời đối tượng: sinh ra, hoạt động, biến mất. Đây là nền tảng của lập trình game và mô phỏng trên mọi nền tảng, không chỉ Scratch.